/**
 * 日期格式化函数
 * @param {Date|string} date 日期对象或日期字符串
 * @param {string} fmt 格式化模板，默认为 'yyyy-MM-dd hh:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, fmt = 'yyyy-MM-dd hh:mm:ss') {
  if (!date) return '';
  
  if (typeof date === 'string') {
    // 尝试将日期字符串转换为日期对象
    const parsedDate = new Date(date);
    if (isNaN(parsedDate.getTime())) {
      return date; // 如果转换失败，返回原始字符串
    }
    date = parsedDate;
  }
  
  const o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  };
  
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  
  for (let k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
    }
  }
  
  return fmt;
}

/**
 * 获取当前日期的字符串表示
 * @param {string} fmt 格式化模板，默认为 'yyyy-MM-dd'
 * @returns {string} 当前日期的字符串表示
 */
export function getCurrentDate(fmt = 'yyyy-MM-dd') {
  return formatDate(new Date(), fmt);
}

/**
 * 获取当前日期时间的字符串表示
 * @param {string} fmt 格式化模板，默认为 'yyyy-MM-dd hh:mm:ss'
 * @returns {string} 当前日期时间的字符串表示
 */
export function getCurrentDateTime(fmt = 'yyyy-MM-dd hh:mm:ss') {
  return formatDate(new Date(), fmt);
}

/**
 * 将日期字符串转换为日期对象
 * @param {string} dateStr 日期字符串
 * @returns {Date|null} 日期对象，或者 null（如果转换失败）
 */
export function parseDate(dateStr) {
  if (!dateStr) return null;
  
  const date = new Date(dateStr);
  return isNaN(date.getTime()) ? null : date;
}

/**
 * 日期加减
 * @param {Date} date 原始日期
 * @param {number} days 天数，正数为加，负数为减
 * @returns {Date} 计算后的新日期
 */
export function addDays(date, days) {
  const newDate = new Date(date);
  newDate.setDate(newDate.getDate() + days);
  return newDate;
}

/**
 * 计算两个日期之间的天数差
 * @param {Date|string} date1 日期1
 * @param {Date|string} date2 日期2
 * @returns {number} 天数差
 */
export function daysBetween(date1, date2) {
  const d1 = typeof date1 === 'string' ? new Date(date1) : date1;
  const d2 = typeof date2 === 'string' ? new Date(date2) : date2;
  
  // 转换为毫秒差，再转换为天数
  const diffTime = Math.abs(d2 - d1);
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
  
  return diffDays;
}

export default {
  formatDate,
  getCurrentDate,
  getCurrentDateTime,
  parseDate,
  addDays,
  daysBetween
}; 